/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.hibernate.util;

import com.myapp.hibernate.model.Boxeador;
import com.myapp.hibernate.model.Combate;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author aacede
 */
public class BoxeadorUtil {

    private Session sesion;
    private Transaction tx;

    private void iniciaOperacion() throws HibernateException {
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction();
    }

    private void manejaExcepcion(HibernateException e) throws HibernateException {
        tx.rollback();
        throw new HibernateException("Ocurrió un error en la capa de acceso a datos. Boxeador", e);
    }

    public Boxeador obtenerBoxeador(int idBoxeador) throws HibernateException {
        Boxeador b = new Boxeador();
        try {
            iniciaOperacion();
            b = (Boxeador) sesion.get(Boxeador.class, idBoxeador);
        } finally {
            sesion.close();
        }

        return b;
    }
    
    public Boxeador obtenerBoxeadordeApuesta(int idBoxeador) throws HibernateException {
        Boxeador b = new Boxeador();
        try {
            iniciaOperacion();
            //b = (Boxeador) sesion.get(Boxeador.class, idApuesta);
            b = (Boxeador) sesion.createQuery("from Boxeador where id_boxeador = "+ idBoxeador).uniqueResult();
        } finally {
            sesion.close();
        }

        return b;
    }

    public ArrayList<Boxeador> obtenerListaBoxeadores() throws HibernateException {
        ArrayList<Boxeador> lista = new ArrayList<Boxeador>();
        try {
            iniciaOperacion();
            lista = (ArrayList<Boxeador>) sesion.createQuery("from Boxeador").list();
        } finally {
            sesion.close();
        }
        return lista;
    }

    public void guardar(Boxeador nuevo) {
        try {
            iniciaOperacion();
            sesion.save(nuevo);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        } finally {
            sesion.close();
        }
    }

    public void actualizaEstadio(Boxeador boxeador) {
        try {
            iniciaOperacion();
            sesion.update(boxeador);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }

    public void borrar(Boxeador boxeador) {
        ApuestaUtil apuestaUtil = new ApuestaUtil();
        apuestaUtil.borrarReferenciasPorBoxeador(boxeador.getIdBoxeador());
        CombateUtil combateUtil = new CombateUtil();
        ArrayList<Combate> listadoCombates = combateUtil.obtenerListaCombatesDeBoxeador(boxeador);
        for (Combate c : listadoCombates) {
            apuestaUtil.borrarReferenciasPorCombate(c);
            combateUtil.borrar(c);
        }
        try {
            iniciaOperacion();
            sesion.delete(boxeador);
            tx.commit();
        } catch (HibernateException e) {
            manejaExcepcion(e);
            throw e;
        }
    }
}
